#!/bin/bash

# 检查参数是否正确（需要提供一个搜索字符串）
if [ $# -ne 1 ]; then
    echo "用法: $0 \"要搜索的字符串\""
    echo "示例: $0 'fmt.Println'  # 查找所有.go文件中包含fmt.Println的行"
    exit 1
fi

SEARCH_STR="$1"

# 定义需要排除的目录（可根据实际需求增删）
EXCLUDE_DIRS=(
    .git
    .svn
    node_modules
    vendor
    dist
    build
    tmp
)

# 构建find命令的排除参数
EXCLUDE_OPTS=""
for dir in "${EXCLUDE_DIRS[@]}"; do
    EXCLUDE_OPTS+=" -path ./$dir -o"
done
# 移除最后一个多余的 -o
EXCLUDE_OPTS="${EXCLUDE_OPTS% -o}"

echo "开始在所有.go文件中搜索字符串: '$SEARCH_STR'"
echo "排除目录: ${EXCLUDE_DIRS[*]}"
echo "----------------------------------------"

# 递归查找所有.go文件，并搜索包含目标字符串的行
# -H: 显示文件名（即使只有一个文件也显示）
# -n: 显示行号
# -r: 递归搜索（这里配合find使用，主要用于处理文件内容）
# --color: 高亮显示匹配的字符串（部分系统可能需要去掉此选项）
find . \( $EXCLUDE_OPTS \) -prune -o -type f -name "*.go" -exec grep -Hn --color "$SEARCH_STR" {} +

echo "----------------------------------------"
echo "搜索完成！"
